//https://leetcode.cn/problems/copy-list-with-random-pointer/description/
//随机链表的复制
//给你一个长度为 n 的链表，每个节点包含一个额外增加的随机指针 random ，该指针可以指向链表中的任何节点或空节点。
//构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成，其中每个新节点的值都设为其对应的原节点的值。
//新节点的 next 指针和 random 指针也都应指向复制链表中的新节点，并使原链表和复制链表中的这些指针能够表示相同的链表状态。
//复制链表中的指针都不应指向原链表中的节点 。
//例如，如果原链表中有 X 和 Y 两个节点，其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ，同样有 x.random --> y 。
//返回复制链表的头节点。
//用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示：
//val：一个表示 Node.val 的整数。
//random_index：随机指针指向的节点索引（范围从 0 到 n-1）；如果不指向任何节点，则为  null 。
//你的代码 只 接受原链表的头节点 head 作为传入参数。

struct Node* copyRandomList(struct Node* head) {
    if(head == NULL)
    return NULL;

	struct Node* cur = head;
    while(cur != NULL)
    {
        struct Node* newnode = (struct Node*)malloc(sizeof(struct Node));
        newnode->val = cur->val;
        newnode->next = cur->next;
        cur->next = newnode;

        cur = newnode->next;
    }

    cur = head;
    while(cur != NULL)
    {
        if(cur->random != NULL)
        cur->next->random = cur->random->next;
        else
        cur->next->random = NULL;

        cur = cur->next->next;
    }

    struct Node* newhead = cur = head->next;
    while(cur != NULL && cur->next != NULL)
    {
        cur->next = cur->next->next;
        cur = cur->next;
    }
    return newhead;
}